/**
 * 发布订阅模式
 */
var Event = (function () {
  var clientList = {};
  var listen,
    trigger,
    remove;

  // 添加监听事件
  listen = function (key, fn) {
    if (!clientList[key]) {
      clientList[key] = [];
    }
    clientList[key].push(fn)
  };

  // 触发事件
  trigger = function () {
    var key = [].shift.call(arguments);
    var fns = clientList[key];

    if (!fns || fns.length === 0) {
      return false;
    }

    for (var i = 0, fn; fn = fns[i++]; ) {
      fn.apply(this, arguments)
    }
  };

  // 删除订阅事件
  remove = function (key, fn) {
    var fns = clientList[key];
    // key 对应的消息没有被人订阅
    if(!fns) {
      return false;
    }

    // 没有传入fn（具体的回调函数），表示取消key对应的所有订阅
    if (!fn) {
      fns && (fns.length = 0);
    } else {
      // 反向遍历
      for (var i = fns.length - 1; i >= 0; i--) {
        var _fn = fns[i];
        if (_fn === fn) {
          // 删除订阅回调函数
          fns.splice(i, 1);
        }
      }
    }
  };

  return {
    listen: listen,
    trigger: trigger,
    remove: remove
  }
}());

export default Event;
